perm filename INITER[NS,NS]1 blob sn#112890 filedate 1974-07-19 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00007 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	Definitions.  The file DEFS must be assembled with this file.
C00003 00003		storage allocations
C00004 00004	INITER
C00009 00005	WORD
C00013 00006	REPEAT 0
C00016 00007	SRTCOM	GETCH	FINISH	NOLOOK	NOENTR	NOCORE
C00020 ENDMK
C⊗;
;Definitions.  The file DEFS must be assembled with this file.
IFNDEF DEBUG <DEBUG←1>
	TITLE	INITER -- creater of INI.DAT file from WORDS.TXT

F←0
A←1
B←2
C←3	;current character
D←4
E←5	;counter and temporary AC

L←6
M←7
N←10

Q←11	;byte pointer
R←12	;temporary byte pointer

W←13	;W:Z are used as LOOKUP and ENTER block
X←14
Y←15
Z←16

P←17	;pdl pointer

;I/O channels

TI ←←0	;text input from WORDS.TXT file
DAT←←1	;output to INI.DAT file
;	storage allocations

IFN DEBUG <

LSYM←←2000
SYM:	BLOCK LSYM

>;END IFN DEBUG

DSK17:	17
	SIXBIT	/DSK/
	0

DATCMD:	IOWD 1,DATA	;dump mode command for writing INI.DAT goes here
	0

NTIBUF←←2
TIBUF:	BLOCK 203*NTIBUF;buffer space for reading in WORDS.TXT
IBUF:	BLOCK	3	;buffer header for reading WORDS.TXT

LPDL←←30
PDL:	BLOCK	LPDL	;pushdown list

DIFILE:	SIXBIT	/WORDS/
	SIXBIT	/NON/
	0↔0

DOFILE:	SIXBIT	/INI/
	SIXBIT	/DAT/
	277000,,0
	0

COMMON:	BLOCK	INDLOC-COMLOC	;COMMON WORDS ARE COLLECTED HERE TEMPORARILY
	0			;COMMON WORD LIST HEADER
LINKS:	BLOCK	INDLOC-COMLOC
;INITER

INITER:	RESET
	MOVE	P,[IOWD LPDL,PDL]

	INIT	TI,0		;CHANNEL FOR INPUT OF WORDS.TXT
	SIXBIT	/DSK/
	IBUF
	HALT	.

	OPEN	DAT,DSK17	;CHANNEL FOR OUTPUT OF INI.DAT
	HALT	.

	MOVE	A,[DIFILE,,W]
	BLT	A,Z
	LOOKUP	TI,W
	JRST 	NOLOOK

	MOVE	A,[DOFILE,,W]
	BLT	A,Z
	ENTER	DAT,W
	JRST	NOENTR

	MOVEI	A,TIBUF
	MOVEM	A,JOBFF↑
	INBUF	TI,NTIBUF	;SET UP INPUT BUFFER RING

IFN DEBUG,<
	HRLZ	W,JOBSYM↑	;GET PTR TO SYMBOL TABLE
	CAMN	W,[SYM,,0]	;HAS IT BEEN MOVED?
	JRST	NOMOVE		;YES
	HRRI	W,SYM		;ADDRESS OF NEW LOC FOR SYMBOL TABLE
	HRRM	W,JOBSYM	;NEW PTR TO SYMBOL TABLE
	HLRE	X,JOBSYM	;GET LENGTH OF SYMBOL TABLE
	MOVN	X,X		;POSITIVE LENGTH
	CAILE	X,LSYM
	HALT	.		;SYMBOL TABLE TOO BIG
	ADDI	X,-1(W)		;ADDRESS OF LAST WORD
	BLT	W,(X)		;MOVE TABLE
NOMOVE:
>;END DEBUG

	PUSHJ	P,GETREC	;INPUT FILE MUST BE IN E/TV FORMAT
	CAIE	C,FF
	JRST	.-2
;WORD

	SETZM	DATA		;NO STORIES YET
	MOVE	A,[DATA,,DATA+1]
	BLT	A,@JOBREL↑	;CLEAR DAT FILE ARRAY

	MOVE	A,[DATLOC,,DATLOC]
	MOVEM	A,DATA+1	;PTR TO FIRST, LAST AND ONLY DICT ENTRY FOR NOW
	MOVEI	E,DATLOC+3
	MOVSM	E,DATA+2	;PTR TO FIRST FREE WORDS IN .DAT FILE, .TXT FILE
	MOVNI	E,1(E)
	HRLM	E,DATCMD	;DUMP MODE COMMAND FOR WRITING INI.DAT
	MOVE	E,['NS',,2]
	MOVEM	E,DATA+3	;VERSION NUMBER

	MOVE	A,[1,,1]
	MOVEM	A,DATA+DATLOC	;DICT PTRS FORWARD AND BACK FOR SINGLE DICT ENTRY
	MOVE	A,[377777,,-1]
	MOVEM	A,DATA+DATLOC+1	;TEXT OF SINGLE WORD IN DICT
	MOVEM	A,COMMON	;ONLY COMMON WORD FOR NOW IS INFINITE
	MOVSI	A,-1
	MOVEM	A,DATA+DATLOC+2	;MARK IT AS A NON-WORD ENTRY

	MOVEI	R,COMMON	;POINTER FOR DEPOSITING COMMON WORDS
	MOVEI	N,INDLOC-COMLOC-1	;MAX NUMBER OF COMMON WORDS
	SETZM	LINKS-1		;COMMON WORD LIST HEADER
	SETZM	LINKS		;ONLY ONE KEYWORD YET

WORD:	PUSHJ	P,GETCH		;get char from input file
	CAIL	C,"A"		;look for beginning of a word--do we have a letter?
	CAILE	C,"Z"
	JRST	WORD		;no
	SOJL	N,TOMANY	;JUMP IF TOO MANY COMMON WORDS
	MOVEI	E,7		;MAX LENGTH OF COMMON WORD
	HRLI	R,010500	;MAKE BYTE POINTER

WORD3:	IDPB	C,R
	PUSHJ	P,GETCH		;get next char
	CAIL	C,"A"		;is it a letter?
	CAILE	C,"Z"
	JRST	WORD4		;NO
	SOJG	E,WORD3		;yes--here we go loop de loop
	OUTSTR	[ASCIZ /COMMON WORD FOUND CONTAINING MORE THAN 7 CHARACTERS
/]
	HALT	.

WORD4:	PUSHJ	P,GETCH
	CAIE	C,LF		;SKIP TO LF
	JRST	WORD4
	MOVE	D,(R)		;CURRENT COMMON WORD
	MOVEI	B,-1		;POINTER TO HEADER OF SORTED COMMON-WORD LIST
WORD5:	MOVE	A,B
	MOVE	B,LINKS(A)	;PTR TO NEXT WORD
	CAMLE	D,COMMON(B)	;RIGHT PLACE IN LIST FOR NEW WORD?
	JRST	WORD5		;NO
	CAMN	D,COMMON(B)	;YES, IS THIS COMMON WORD ALREADY IN LIST?
	JRST	DUPLIC		;YES
	MOVEI	C,-COMMON(R)	;NUMBER OF THIS NEW COMMON WRD
	MOVEM	B,LINKS(C)	;MAKE THIS WORD PT TO NEXT ONE
	MOVEM	C,LINKS(A)	;MAKE PREVIOUS ONE POINT TO THIS ONE
	JRST	WORD
;REPEAT 0

REPEAT 0,<

	MOVEI	A,DATA+20(E)	;MAKE SURE ENOUGH ROOM TO ADD NEW ENTRY TO DICT
	CAMG	A,JOBREL↑	;ENOUGH CORE?
	JRST	COREOK		;YES
	CORE	A,		;NO, GET ENOUGH
	JRST	NOCORE		;OOPS!
	SETZM	DATA(E)
	MOVEI	A,DATA+1(E)
	HRLI	A,-1(A)
	BLT	A,@JOBREL	;CLEAR NEW CORE
COREOK:	

	MOVE	R,[POINT 5,DATA+1(E)] ;byte ptr for depositing text into .DAT file

;---


	MOVEI	C,1		;ptr to dict list header
SORT1:	MOVE	D,C		;D points to prev dict word
	HRRZ	C,DATA(D)	;C points to next dict word
	MOVEI	A,1(E)		;get ptr to text of new word
	MOVEI	B,1(C)		;get ptr to text of old word
SORT2:	MOVE	M,DATA(A)	;get a word of text of new word
	CAMLE	M,DATA(B)	;and compare against corresponding part of old word
	JRST	SORT1		;move on down keyword list
	CAME	M,DATA(B)
	JRST	SORT4		;insert right here in list
	TRNN	M,1		;keywords equal so far--at end of keyword?
	AOJA	A,[AOJA B,SORT2];no--get next part of each keyword
	OUTSTR	[ASCIZ /DUPLICATE /]
	JRST	WORD		;discard entry for new word

SORT4:	HRLI	C,(D)		;make forward/backward ptr for new dict entry
	MOVEM	C,DATA(E)	; and place into entry
	HRRM	E,DATA(D)	;make prev entry point to new one
	HRLM	E,DATA(C)	;make next entry point back to new one
	ADDI	E,2-DATA(R)	;advance free .DAT ptr beyond new entry
	MOVSI	A,-1
	MOVEM	A,DATA-1(E)	;make new entry a non-word
	JRST	WORD		;get next word from input file
>;END REPEAT 0
;SRTCOM	GETCH	FINISH	NOLOOK	NOENTR	NOCORE

GETCH:	SOSG	IBUF+2
GETREC:	IN	TI,
	JRST	GETCH1
	STATZ	TI,20000
	JRST	FINISH
	OUTSTR	[ASCIZ /INPUT FILE ERROR./]
	HALT	.

GETCH1:	ILDB	C,IBUF+1
	JUMPE	C,GETCH
	POPJ	P,

;PUT SORTED COMMON WORDS INTO .DAT FILE ARRAY
FINISH:	MOVE	A,LINKS-1	;PTR TO FIRST COMMON WORD
	SETZ	E,
FINIS0:	MOVE	B,COMMON(A)	;ACTUAL WORD
	MOVEM	B,DATA+COMLOC(E);STORE IN .DAT FILE ARRAY
	SKIPE	A,LINKS(A)	;PTR TO NEXT COMMON WORD
	AOJA	E,FINIS0
	MOVE	A,[377777,,-1]
	MOVEM	A,DATA+COMLOC+1(E);PUT INFINITE KEY AT END OF COMMON WORD LIST

;NOW WE MUST FILL IN THE COMMON WORD INDEX POINTERS
	SETZB	E,D		;D IS THE INDEX VALUE WE WILL FILL NEXT
				;E POINTS TO THE CURRENT COMMON WORD
	SETZ	A,
FINIS2:	CAIL	D,2000		;FILLED LAST INDEX SLOT YET?
	JRST	FINIS4		;YES
	MOVE	B,A		;SAVE OLD INDEX FROM COMMON WORD
	LDB	A,[POINT 10,DATA+COMLOC(E),11] ;PICK UP INDEX VALUE FOR COMMON WORD
	CAIN	A,(B)		;DOES COMMON WORD HAVE SAME INDEX AS PREVIOUS ONE?
	AOJA	E,.-2		;YES, NEXT COMMON WORD
FINIS3:	CAIGE	A,(D)		;SKIP IF COMMON WORD TO BE POINTED TO BY INDEX SLOTS
	AOJA	E,FINIS2	;GET NEXT COMMON WORD
	HRLZM	E,DATA+INDLOC(D);POINT TO COMMON WORD
	AOJA	D,FINIS3	;NEXT INDEX SLOT

FINIS4:	OUT	DAT,DATCMD	;WRITE OUT FILE
	JRST	FINIS1
	OUTSTR	[ASCIZ /OUTPUT FILE ERROR./]
	HALT	.

FINIS1:	RELEAS	DAT,
	RELEAS	TI,
	EXIT

UUCODE:	0			;UUOS (OF WHICH THERE ARE NONE) JSR TO HERE
	OUTSTR	[ASCIZ /ILLEGAL USER UUO
/]
	HALT	.

DUPLIC:	OUTSTR	[ASCIZ/DUPLICATE COMMON WORD.
/]
	HALT	.

TOMANY:	OUTSTR	[ASCIZ/TOO MANY COMMON WORDS; MUST RECOMPILE NS SYSTEM.
/]
	HALT	.

NOCORE:	OUTSTR	[ASCIZ/FAILED TO GET ENOUGH CORE.
/]
	HALT	.

NOLOOK:	OUTSTR	[ASCIZ/LOOKUP FAILED -- /]
	HRRZ	X,X		;GET ERROR CODE
	CAILE	X,MAXERR
	MOVEI	X,MAXERR
	OUTSTR	@FERROR(X)
	OUTSTR	[ASCIZ/.
/]
	HALT	.

NOENTR:	OUTSTR	[ASCIZ/ENTER FAILED -- /]
	HRRZ	X,X		;GET ERROR CODE
	CAILE	X,MAXERR
	MOVEI	X,MAXERR
	OUTSTR	@FERROR(X)
	OUTSTR	[ASCIZ/.
/]
	HALT	.

FERROR:	[ASCIZ/NO SUCH FILE/]
	[ASCIZ/ILLEGAL PPN/]
	[ASCIZ/PROTECTION VIOLATION/]
	[ASCIZ/FILE BUSY/]
MAXERR←←.-FERROR
	[ASCIZ/BAD RETRIEVAL OR OTHER HORRIBLE ERROR/]

	LIT
	VAR

DATA:	BLOCK	DATLOC+3
	0

	END	INITER